home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / basic / pbtool.exe / PRINTDBF.BAS < prev    next >
BASIC Source File  |  1991-11-15  |  5KB  |  136 lines

  1. '----------------------------------------------------------
  2. '  PROGRAM: PRINTBF.BAS        PROGRAMMER: A. KELLETT
  3. '  DATE-WRITTEN: 11/14/91
  4. '  USING POWER BASIC V2.10A
  5. '
  6. '  THIS PROGRAM READS/PRINTS THE CONTENTS OF A dBASE (TM) .DBF
  7. '  (THE DATA) FILE.  DOES NOT LOOK AT INDEX (.NDX) FILES.
  8. '  VERSION: 0.00    LAST UPDATED: 00/00/00
  9. '----------------------------------------------------------
  10. CLS
  11. LOCATE 1,5:INPUT "ENTER NAME OF dBASE FILE TO VIEW: ";FILENAME1$
  12.  
  13. GOSUB FILEEXISTS
  14.  
  15. LOCATE 2,5:INPUT "ENTER P TO PRINT OR D FOR DISPLAY: ";PRINTSWITCH$
  16.  
  17. MAP HEADER$$ * 32, 1 AS VERSION$$, 1 AS YEAR$$, 1 AS MONTH$$, 1 AS DAY$$,_
  18.    4 AS TOT.RECORDS$$, 2 AS HEADER.SIZE$$, 2 AS RECORD.LENGTH$$,_
  19.    20 AS FILLER$$
  20. MAP FIELDHEADER$$ * 32, 10 AS FIELD.NAME$$, 1 AS FILLER1$$, _
  21.    1 AS FIELD.TYPE$$, 4 AS FILLER2$$, 1 AS FIELD.WIDTH$$,_
  22.    1 AS DECIMALS$$, 14 AS FILLER3$$
  23. MAP FDATA$$ * 19, 10 AS FIELDNAME$$, 2 AS FIL1$$, 1 AS FTYPE$$,_
  24.    2 AS FIL2$$, 1 AS FWIDTH$$, 2 AS FIL3$$, 1 AS FDECIMAL$$
  25.  
  26. OPEN FILENAME1$ FOR BINARY AS #1
  27.    GET$ 1, 32, HEADER$$
  28.  
  29.    X1 = ASC(LEFT$(TOT.RECORDS$$,1)):X2 = ASC(MID$(TOT.RECORDS$$,2,1))
  30.    X3 = ASC(MID$(TOT.RECORDS$$,3,1)):X4 = ASC(RIGHT$(TOT.RECORDS$$,1))
  31.    TOT.RECORDS& = X1 + (256 * X2) + (4096 * X3) + (65536 * X4)
  32.    HEADER.SIZE& = ASC(LEFT$(HEADER.SIZE$$,1))_
  33.       + (256 * ASC(RIGHT$(HEADER.SIZE$$,1)))
  34.    RECORD.LENGTH& = ASC(LEFT$(RECORD.LENGTH$$,1))_
  35.       + (256 * ASC(RIGHT$(RECORD.LENGTH$$,1)))
  36.    NUM.FIELDS& = ((HEADER.SIZE& - 1) \ 32) - 1
  37.  
  38.    LOCATE 5,5:PRINT "dBASE VERSION: ";ASC(VERSION$$)
  39.    LOCATE 6,5:PRINT "MODIFIED   YR: ";ASC(YEAR$$)
  40.    LOCATE 7,5:PRINT "           MM: ";ASC(MONTH$$)
  41.    LOCATE 8,5:PRINT "           DD: ";ASC(DAY$$)
  42.    LOCATE 9,5:PRINT "TOT RECORDS  : ";TOT.RECORDS&
  43.    LOCATE 10,5:PRINT "HEADER SIZE  : ";HEADER.SIZE&
  44.    LOCATE 11,5:PRINT "RECORD LENGTH: ";RECORD.LENGTH&
  45.    LOCATE 12,5:PRINT "NUMBER FIELDS: ";NUM.FIELDS&
  46.  
  47.    DIM FIELD.DATA$(1:NUM.FIELDS&)
  48.    FOR I% = 1 TO NUM.FIELDS&
  49.       GET$ 1, 32, FIELDHEADER$$
  50.  
  51.       FIELD.WIDTH% = ASC(FIELD.WIDTH$$)
  52.       FIELD.WIDTH$ = USING$("##", FIELD.WIDTH%)
  53.       IF DECIMALS$$ = CHR$(0) THEN
  54.      DECIMALS% = 0:FDECIMAL$$ = "0"
  55.       ELSE
  56.      DECIMALS% = ASC(DECIMALS$$):FDECIMAL$$ = DECIMAL$$
  57.       END IF
  58.  
  59.       LOCATE 14,5:PRINT "FIELD NAME  : ";FIELD.NAME$$
  60.       LOCATE 15,5:PRINT "FIELD TYPE  : ";FIELD.TYPE$$
  61.       LOCATE 16,5:PRINT "FIELD WIDTH : ";FIELD.WIDTH%
  62.       LOCATE 17,5:PRINT "DECIMALS    : ";DECIMALS%
  63.       LOCATE 19,5:PRINT USING "      FIELD NUMBER ###      ";I%
  64.       DELAY 1
  65.  
  66.       FOR J% = 1 TO LEN(FIELD.NAME$$)
  67.          IF MID$(FIELD.NAME$$,J%,1) = CHR$(0) THEN
  68.             MID$(FIELD.NAME$$,J%,1) = " "
  69.          END IF
  70.       NEXT J%
  71.       FIELD.DATA$(I%) = FIELD.NAME$$ + "  " + FIELD.TYPE$$ +_
  72.          "  " + FIELD.WIDTH$ + "  " + FDECIMAL$$
  73.    NEXT I%
  74.  
  75. CLOSE #1
  76.  
  77. LOCATE 20,1:PRINT "      PRESS ANY KEY TO VIEW/PRINT FILE LAYOUT"
  78. WHILE NOT INSTAT
  79. WEND
  80.  
  81. '**** EITHER PRINT OR DISPLAY THE FILE LAYOUT ****
  82. CLS
  83. IF PRINTSWITCH$ = "P" THEN
  84.    LPRINT
  85.    LPRINT "FILE: ";FILENAME1$;"    NUMBER OF RECORDS: ";TOT.RECORDS&
  86.    LPRINT "FIELDS: ";NUM.FIELDS&;"   RECORD SIZE: ";RECORD.LENGTH&
  87. ELSE
  88.    PRINT
  89.    PRINT "FILE: ";FILENAME1$;"    NUMBER OF RECORDS: ";TOT.RECORDS&
  90.    PRINT "FIELDS: ";NUM.FIELDS&;"   RECORD SIZE: ";RECORD.LENGTH&
  91. END IF
  92.  
  93. FOR I = 1 TO NUM.FIELDS&
  94.    IF PRINTSWITCH$ = "P" THEN
  95.       LPRINT USING "  ###  ";I;:LPRINT FIELD.DATA$(I)
  96.    ELSE
  97.       PRINT USING  "  ###  ";I;:PRINT FIELD.DATA$(I)
  98.    END IF
  99.    IF I/20 = INT(I/20) THEN
  100.       DELAY 3
  101.    END IF
  102. NEXT I
  103.  
  104. END
  105. '
  106. '
  107. '----------------------------------------------------------
  108. FILEEXISTS:
  109.    OPEN FILENAME1$ FOR BINARY AS #1
  110.       IF LOF(1) < 1 THEN       '** FILE LENGTH LESS THAN 0 **
  111.          LOCATE 15,5
  112.          PRINT "THE INPUT FILE DOES NOT EXISTS."
  113.          CLOSE #1              '** CLOSE THE NON-EXISTANT FILE **
  114.          KILL FILENAME1$       '** DELETE 0 LENGTH FILE WE'VE CREATED **
  115.          DELAY 2.5             '** PAUSE FOR USER TO READ MESSAGE **
  116.          LOCATE 22,1
  117.          END                   '** END PROCESSING HERE **
  118.       END IF
  119.    CLOSE #1                    '** CLOSE IN CASE IT DID EXIST **
  120.  
  121. RETURN
  122. '----------------------------------------------------------
  123. '   Information on the structure of dBASE .DBF files were
  124. '          obtained from the following two sources:
  125. '
  126. '   dBASE III Plus Programmer's Reference Guide  pp.859 - 875
  127. '   by Alan Simpson ( 1987 SYBEX Inc.)  No dBASE programmer
  128. '   should ever be more than arms-length away from this book.
  129. '
  130. '   BASIC Techniques and Utilities p. 251  by Ethan Winer
  131. '   ( 1991 Ziff-Davis Press ).  Never thought about reading dBASE
  132. '   files from Turbo/PowerBasic until I stumbled over his
  133. '   easy-to-understand chapter.  Did not use his code as a model.
  134. '
  135. '
  136.